#!/usr/bin/python
#coding=utf-8
'''
    4.5 反向迭代
    方向迭代一个序列
'''
#
# a = [1, 2, 3, 4]
# for x in reversed(a):
#     print(x)

# 反向迭代仅仅当对象的大小可预先确定或者对象实现了__reversed__()
# 的特殊方法时才能生效。
# 如果两者都不符合，那你必须先将对象转换为一个列表才行

# 在自定义类上实现__reversec__()方法 来实现反向迭代
class Countdwon:
    def __init__(self, start):
        self.start = start

    # Forward iteration
    def __iter__(self):
        n = self.start
        while n > 0:
            yield n
            n -= 1

    # Reverse iteration
    def __reversed__(self):
        n = 1
        while n <= self.start:
            yield n
            n += 1

for rr in reversed(Countdwon(30)):
    print(rr)

for rr in Countdwon(30):
    print(rr)

# 总结：
# 定义一个反向迭代器可以使得代码非常高效，
# 因为它不再需要将数据填充到一个列表中 然后再去反向迭代这个列表
